package com.topfox.common;

import com.topfox.annotation.Ignore;
import com.topfox.data.Field;
import com.topfox.data.TableInfo;
import com.topfox.misc.BeanUtil;
import com.topfox.misc.JsonUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Map;

/**
 * 基础QTO
 */
@Accessors(chain = true)
public class DataQTO extends DataPojo implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 允许返回null
     */
    @Getter @Setter
    private Boolean allowNull;// = true;

    /**
     * 是否读取 一级 二级缓存的数据,  null 和true都会读取,  false不读取
     */
    @Ignore transient
    private boolean readCache=true;
    public DataQTO readCache(boolean value){
        readCache = value;
        return this;
    }
    public boolean readCache(){
        return readCache;
    }

    /**
     * 查询页码
     */
    @Getter @Setter
    private Integer pageIndex=0;

    /**
     * 每页条数
     */
    @Getter @Setter
    private Integer pageSize;


    /**
     * 类库专用字段. 类库根据 pageIndex 和 pageSize写值
     */
    @Getter @Setter
    private String limit;

    /**
     * 排序字段, 多个字段用逗号串起来
     */
    @Getter @Setter
    private String orderBy;

    /**
     * 分组字段
     */
    @Getter @Setter
    private String groupBy;

    @Getter @Setter
    private String having;

    /**
     * 蒋QTO的数据转为map
     * @return
     */
    public Map mapData(){
        Map map= BeanUtil.bean2Map(this);
        map.remove("pageIndex");map.remove("pageSize");map.remove("allowNull");map.remove("readCache");
        map.remove("limit");map.remove("orderBy");map.remove("groupBy");map.remove("having");
        return map;
    }

    /**
     * 检查qto中是否只存在完整的主键值(多主键时), 且无其他字段的值
     * @return
     */
    public boolean checkOnlyKeysValue(){
        Map mapQTO=mapData();
        if (mapQTO.size() != tableInfo().getMapIdFields().size()){
            mapQTO.clear();mapQTO=null;
            return false;
        }

        //条件匹配器中是否只有主键字段的条件
        boolean isOnlyIdValues = true;

        //Id字段设置为null, 不支持修改的
        Map<String, Field> mapKeyFields = tableInfo().getMapIdFields();
        for(Map.Entry<String, Field> entry : mapKeyFields.entrySet()){
            String key = entry.getKey();
            if (isOnlyIdValues == true && !mapQTO.containsKey(key) ){
                isOnlyIdValues = false; break;
            }
        }
        mapQTO.clear();mapQTO=null;
        return isOnlyIdValues;
    }

    @Override
    public String toString(){
        return JsonUtil.toString(this);
    }

}
